//
//  CJEmoticonTools.swift
//  SinaWeibo
//
//  Created by 程建 on 16/10/8.
//  Copyright © 2016年 itcast. All rights reserved.
//
//  加载表情数据

import UIKit

//每页有多少个表情
let emticonPageCount = 20

//通知名称
let KsaveRecentEmoticon = "KsaveRecentEmoticon"

//文件路径
private let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("recent.plist")


class CJEmoticonTools: NSObject {

    static let sharedEmoticonTools = CJEmoticonTools()
    
    
    //所有的表情数组  二位数组 --> 三维数组 [[[HMEmoticon]]]
    lazy var allEmoticons: [[[CJEmoticon]]] = {
    
        return [[self.recentEmoticons],
                self.emoticonPages(emoticons:self.defaultEmoticons),
                self.emoticonPages(emoticons:self.emojiEmoticons),
                self.emoticonPages(emoticons:self.laxEmoticons)]
    
    }()
    
    //将模型数组切割为二维数组
    private func emoticonPages(emoticons:[CJEmoticon]) -> [[CJEmoticon]] {
    
        //按照每页20个表情,对模型数组进行切割(分页)
        let pageCount = (emoticons.count - 1) / emticonPageCount + 1
        //分页截取
        var sectionEmoticon = [[CJEmoticon]]()
        for i in 0..<pageCount {
            
            //截取数组 (起始位,和长度)
            let loc = i * emticonPageCount
            var len = emticonPageCount
            
            //需要进行判断 loc + len 和emoticons.count  因为最后一组不足20个
            if loc + len  > emoticons.count {
                //最后一组的长度
                len = emoticons.count - loc
            }
            
            let array = (emoticons as NSArray).subarray(with: NSMakeRange(loc, len))
            
            //添加到二维数组中
            sectionEmoticon.append(array as! [CJEmoticon])
        }
        
        return sectionEmoticon
        
    }
    
    
    
    //第一组的表情数组
    lazy var recentEmoticons: [CJEmoticon] = {
    
        if let array = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? [CJEmoticon] {
            
            return array
        }
        
        return [CJEmoticon]()
        
    }()
    
    
    //bundle对象的属性
    lazy var emoticonBundle: Bundle = {
        
        //获取Emoticons.bundle的路径
        let path = Bundle.main.path(forResource: "Emoticons.bundle", ofType: nil)
        
        //根据路径获取Bundle对象
        let emoticonBundle = Bundle.init(path: path!)!
        
        return emoticonBundle
        
    }()
    
    //获取默认表情数组
    private lazy var defaultEmoticons: [CJEmoticon] = {
        
        return self.loadEmoticons(path: "default/info.plist")
    }()
    
    //获取emoji表情
    private lazy var emojiEmoticons: [CJEmoticon] = {
    
      return self.loadEmoticons(path: "emoji/info.plist")
        
    }()
    
    //获取lxh表情
    private lazy var laxEmoticons: [CJEmoticon] = {
       
        return self.loadEmoticons(path: "lxh/info.plist")
        
    }()
    
    

    //根据不同的路径放回不同的表情模型数组
    func loadEmoticons(path:String) -> [CJEmoticon] {
        
        //1.获取Emoticons.bundle路径
  //      let path = Bundle.main.path(forResource: "Emoticons.bundle", ofType: nil)
        
        //2.根据路径获取bundle对象
  //      let emoticonBundle = Bundle.init(path: path!)!
        
        //使用bundle的pathForResource方法读取bundle对象中的文件
  //      let infoPath = emoticonBundle.path(forResource: "default/info.plist", ofType: nil)
        let infoPath = self.emoticonBundle.path(forResource: path, ofType: nil)
        
        //读取数组类型的plist文件
        let array = NSArray(contentsOfFile: infoPath!) as! [[String : Any]]
        
        
        var emoticons = [CJEmoticon]()
        
        for item in array {
            
            //实例化模型
            let e = CJEmoticon()
            
            //字典转模型
            e.yy_modelSet(with: item)
            if let img = e.png {
                //emoji没有 表情这个属性
                e.imagePath = (path as NSString).deletingLastPathComponent + "/" +  img
                
            }
            emoticons.append(e)
        }
        
        return emoticons
        
    }
    
    
    func saveRecentEmoticons(em:CJEmoticon) {
        //在这里面完成存的操作
        //使用归档的方式来存储数据  每次点击都对数组进行存储的操作
        //0.去重 判断表情在数组中是否存在,如果存在的话就先移除
        if recentEmoticons.contains(em) {
            
            //如果包含该元素 求出该元素对应的索引
            guard let index = recentEmoticons.index(of: em) else {
                return
            }
            //移除
            recentEmoticons.remove(at: index)
        }
        
        
        //1.向数组中角标为0的位置插入em
        //swift中的数组 是根据数据的元素数量 动态的申请内存空间的
        recentEmoticons.insert(em, at: 0)
        
        //2. 在存储数组之前需要判断数组的数量是否大于20 如果大于20就应该移除最后一个表情模型
        if recentEmoticons.count > 20 {
            recentEmoticons.removeLast()
        }
        
        //给allEmoticons 赋值
        allEmoticons[0][0] = recentEmoticons
        
        //3. 存储表情模型数组
        
        
        NSKeyedArchiver.archiveRootObject(recentEmoticons, toFile: path)
        
        
        //显示到最近的分组这一组 如何显示  需要刷新第0组
        // 当两个类之间没有明前前后关系  使用通知是最好的方式
        NotificationCenter.default.post(name: NSNotification.Name(KsaveRecentEmoticon), object: nil)
        
        
        
        
    }
    
    
    
    
}
